package com.briup.web;

import com.briup.pojo.Student;
import com.briup.pojo.StudentWithAddress;

import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


@RequestMapping("/path") // 类级别的@RequestMapping 定义了这个程序类中所有方法的公共请求路径前缀
@RestController // Conteoller类必须要添加 具体后面分解
public class PathController {
    @RequestMapping("/test")
    public String test() {
        System.out.println("in test()");
        return "Hello,PathController，test()";
    }
//    @RequestMapping(path = {"/hello", "/hi"}) //通过path属性来定义多个请求路径
    @RequestMapping(value = {"/hello", "/hi"})  //value属性也可以
    public String hello() {
        System.out.println("in hello()");
        return "Hello,PathController，hello()";
    }

    // 指定请求方法
    // @RequestMapping(value = "/method",method = RequestMethod.POST)  //value属性来定义多个请求路径 通过method属性来指定请求方法
    @RequestMapping(value = "/method",method = {RequestMethod.POST,RequestMethod.GET})  //value属性来定义多个请求路径 通过method属性来指定请求方法
    public String method() {
        System.out.println("in method()");
        return "Hello,PathController，method()";
    }

    // 获取请求参数
    @RequestMapping(value = "/getParams",method = {RequestMethod.POST,RequestMethod.GET})  //value属性来定义多个请求路径 通过method属性来指定请求方法
    public String getParams(HttpServletRequest request) {
        // 获取请求参数
        String name = request.getParameter("name");
        String ageStr = request.getParameter("age");
        int age= Integer.parseInt(ageStr);
        System.out.println("name:"+name+"，age:"+age);
        System.out.println("in getParams()");
        return "ok";
    }

    // 参数获取方式
    @RequestMapping("/simpleParam")
    public String simpleParam(String name, Integer age) {
        System.out.println("name:"+name+"，age:"+age);
        return "ok";
    }

    // 参数获取方式 - @RequestParam解决请求参数名称不一样 无法映射的问题
    @RequestMapping("/simpleParam2")
    public String simpleParam2(@RequestParam("username") String name, Integer age) {
        System.out.println("name:"+name+"，age:"+age);
        return "ok";
    }

    // 实体参数 - 请求参数的名称要和pojo类的属性名一致 否则无法封装
    @RequestMapping("/simplePojo")
    public String simplePojo(Student stu) {
        System.out.println("stu:"+stu);
        return "ok";
    }

    // 实体参数 - 请求参数的名称要和pojo类的属性名一致 否则无法封装
    // 127.0.0.1:8081/path/complexPojo?name=zs&age=18&address.province=neimenggu&address.city=baotou
    @RequestMapping("/complexPojo")
    public String complexPojo(StudentWithAddress stu) {
        System.out.println("stu:"+stu);
        return "ok";
    }

    // 数组参数 - 请求参数的名称要和形参中的数组名一致 否则无法封装
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] likes) {
        System.out.println(Arrays.toString(likes));
        return "ok";
    }

    // 集合参数 - 请求参数的名称要和形参中的数组名一致 否则无法封装
    @RequestMapping("/listParam")
    public String listParam(@RequestParam List<String> likes) {
        System.out.println(likes);
        return "ok";
    }

    // 集合参数 - 请求参数的名称要和形参中的数组名一致 否则无法封装
    // 必须通过Post请求方式才能发送JSON数据
    @RequestMapping(value = "/jsonParam" ,method = RequestMethod.POST)
    public String jsonParam(@RequestBody StudentWithAddress stu) {
        System.out.println(stu);
        return "ok";
    }

    // 根据id删除用户 127.0.0.1:8081/path/deleteById?id=1
    // 根据id删除用户 127.0.0.1:8081/path/deleteById/1
    // 路径参数
    // 必须通过Post请求方式才能发送JSON数据
    @RequestMapping("/deleteById/{id}")
    public String jsonParam(@PathVariable Integer id) {
        System.out.println(id);
        return "ok";
    }

    @RequestMapping("/query/{id}/{username}")
    public String query(@PathVariable Integer id,
                        @PathVariable("username") String name) {
        System.out.println(id);
        System.out.println(name);
        return "ok";
    }

    @RequestMapping("/queryStuById/{id}")
    @ResponseBody // 如果要返回对象的json格式数据，要借助@ResponseBody
    public List<Student> queryStuById(@PathVariable Integer id) {
        System.out.println(id);
        // 返回对象 json
        Student student = new Student();
        student.setName("张三");
        student.setAge(20);
        Student student1 = new Student();
        student1.setName("张三1");
        student1.setAge(21);
        ArrayList<Student> stuList = new ArrayList<>();
        stuList.add(student);
        stuList.add(student1);
        return stuList;
    }
}
